
/*#include "sys.h"
#include "delay.h"
#include "usart.h"
*/
#include "rtc.h"


_calendar_obj calendar;//时钟结构体 


//判断是否是闰年函数
//月份   1  2  3  4  5  6  7  8  9  10 11 12
//闰年   31 29 31 30 31 30 31 31 30 31 30 31
//非闰年 31 28 31 30 31 30 31 31 30 31 30 31
//输入:年份
//输出:该年份是不是闰年.1,是.0,不是
u8 Is_Leap_Year(u16 year)
{
	if(year%4==0) //必须能被4整除
	{
		if(year%100==0)
		{
			if(year%400==0)
				return 1;//如果以00结尾,还要能被400整除
			else
				return 0;
		}
		else
			return 1;
	}
	else
		return 0;
}


//获得现在是星期几
//功能描述:输入公历日期得到星期(只允许1901-2099年)
//输入参数：公历年月日 
//返回值：星期号
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表

u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{
	u16 temp2;
	u8 yearH,yearL;

	yearH=year/100;	yearL=year%100;
	// 如果为21世纪,年份数加100
	if (yearH>19)yearL+=100;
	// 所过闰年数只算1900年之后的
	temp2=yearL+yearL/4;
	temp2=temp2%7;
	temp2=temp2+day+table_week[month-1];
	if (yearL%4==0&&month<3)temp2--;
	return(temp2%7);
}

/* 返回绝对值 */
int abs1(int a,int b)
{
 if(a>=b)
  return (a-b);
 else
  return (b-a);
}

/* 判断是否为闰年：是，返回1；不是，返回0 */
int IsLeap(int year)
{
 if(((year%4==0)&&(year%100!=0))||year%400==0)
  return 1;
 else
  return 0;
}

/* 判断某个日期从年初（y年1月1日）到该天(y年m月d日)的天数*/
int Days(int y,int m,int d)
{
 int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 int i;
 int sum = 0 ;  /* 计算天数 */
 if(IsLeap(y)) /* 如果为闰年，2月有29天 */
  days[2] = 29 ;
 for(i=0;i<m;i++)
  sum = sum +days[i] ;
 sum = sum + d - 1 ;
  return sum;
}

/*
 判断两个日期之间的天数
 日期1:年y1,月 m1,日 d1；
日期2: 年y2,月 m2,日 d2;
*/
int DiffDays(int y1,int m1,int d1,int y2,int m2,int d2)
{
	 int s1,s2; /* 计算两个日期从年初到该日的天数 */
	 int count; /* 计算两个年份之间的差值 */
	 int sum=0; /*                        */
	 int t,t1,t2;
	 if(y1==y2)
	 {
		  s1 = Days(y1,m1,d1);
		  s2 = Days(y2,m2,d2);
		  return abs1(s1,s2);
	 }

	 else
	 {
		  count = y2 - y1 ;
		  if(count == 1)
		  {
			   t2 = Days(y2,m2,d2);
			   t1 = Days(y1,12,31) - Days(y1,m1,d1);
			   return (t1+t2+count);
		  }
		  else
		  {
			   for(t = y1+1;t<y2;t++)
					sum = sum + Days(t,12,31);
			   t2 = Days(y2,m2,d2);
			   t1 = Days(y1,12,31) - Days(y1,m1,d1);
			   return (sum+t1+t2+count);
		  }
	 }
}

//判断闰年
int IsLeapYear(int iYear)
{
	 if (iYear<1600||iYear>=10000)
	 {
		return -1;
	 }
	 if ( (iYear%4==0 && iYear%100 != 0) || iYear % 400 == 0)//判断闰年的条件
	 {
		return 1;
	 }else
	 {
		return 0;
	 }
}

//判断日期合法性
int DateCheck(int iYear,int iMonth,int iDay)
{
	 if (iYear<1600||iYear>=10000||iMonth>12||iMonth<1||iDay<1||iDay>31)
	 {
		   return 0;
	 }
	 if (iMonth==4||iMonth==6||iMonth==9||iMonth==11)
	 {
			if (iDay==31)
			{
			 return 0;
			}
	 }else if (iMonth==2)
	 {
			if (IsLeapYear(iYear)==0)
			{
				 if (iDay>28)
				 {
					return 0;
				 }
			}
			else
			{
				 if (iDay>29)
				 {
					return 0;
				 }
			}
	 }
	 return 1;
}

//判断时间合法性
int TimeCheck(int hour,int minute,int second)
{
	 if (hour<0||hour>23)
	 {
		   return 0;
	 }
	 else
	 {
			if (minute<0||minute>59)
		 {
				 return 0;
		 }
		 if (second<0||second>59)
		 {
				 return 0;
		 }
     else  return 1;
	 }
}

//判断日期时间格式
char DataTimerYN(int iYear,int iMonth,int iDay,int hour,int minute,int second)
{
   if(DateCheck(iYear,iMonth,iDay))
	 {
	    if(TimeCheck(hour,minute,second))
			{
			   return 1;
			}
			else return 0;

	 }
	 else return 0;
}


/******************************
计算N天后日期
******************************/
/*
void DateDifference(u8 daytime ,u16 year,u8 month,u8 day)
{
//      int year,month,day;
      int leapyear=0;//闰年时使用
//      int daytime=0;
      int sum;
	   u16 years,months,days;
      static int month_date[12]={31,28,31,30,31,30,31,31,30,31,30,31};


      if(year<=0||month>12||month<1)//判断输入是否有误
      {
#ifdef DEBUG
            printf("时间年月日Error!\n");
#endif
      }
      if(year%400==0||(year%4==0&&year%100!=0))//判断是否闰年
        leapyear=1;//闰年+1
       if(month==2)//判断日是否输入正确，2月是特殊  区分闰年和平年
       { if((month_date[month-1]+leapyear)<day||day<=0)
         {
          printf("Error!\n");
         }
       }
      if(month!=2)//当输入不是2月时，判断输入
      {
          if(month_date[month-1]<day||day<=0)
          {
#ifdef DEBUG
            printf("day输入Error!\n");
#endif
          }
      }
//      if(daytime < 0)
//      {
//#ifdef DEBUG
//            printf("时间间隔Error!\n");
//#endif
//      }
      sum=daytime+day;//当期日期与N天相加
      do
      {
        if(month==2)//判断当月是不是2月份
          month_date[month-1]+=leapyear;
        if(sum>month_date[month-1])
        {
          sum-=month_date[month-1];
          month++;//超过当月天数，加一个月
          if(month==13)//当月份超过12月时，重新返到1月
          {
            year++;//加1年
            if(year%400==0||(year%4==0&&year%100!=0))//判断加一年后是否闰年
              leapyear=1;
            else
              leapyear=0;//不是闰年则为0
            month=1;//12月的下一个月是1月
          }
        }
      }while(sum>month_date[month-1]);//当加起来的天数少于当月的天数就停止循环
      day=sum;
//#ifdef DEBUG
//      printf("\n第%d天后是%d %d %d",daytime,year,month,day);//输出
//#endif
    years=year;
    months=month;
	days=day;
}

*/


/******************************
日历比较运算
******************************/
u8 Calendar_Choose(u8 year1,u8 month1,u8 day1,u8 year2,u8 month2,u8 day2)
{
   unsigned int Startdate,Stopdate,Nowdate;

	Nowdate=(calendar.w_year-2000)*365+calendar.w_month*30+calendar.w_date;
	Startdate=year1*365+month1*30+day1;
	Stopdate=year2*365+month2*30+day2;

	if(Nowdate>=Startdate)
	{
	  if(Nowdate<=Stopdate)
		{
		   return 1;
		}
		else
		{
		   return 0;
		}
	}
	else return 0;
}

/******************************************************************************/












